﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Data;
using System.Reflection;
using System.Data.Common;

namespace common
{

	/// <summary>
	/// JSON帮助类
	/// </summary>
	public class JsonHelper
	{
		#region 通用方法
		/// <summary>
		/// 格式化字符型、日期型、布尔型
		/// </summary>
		public static string StringFormat(string str, Type type)
		{
			if (type == typeof(string))
			{
				str = StringFilter(str);
				str = "\"" + str + "\"";
			}
			else if (type == typeof(DateTime) || type == typeof(DateTime?))
			{
				str = "\"" + str + "\"";
			}
			else if (type == typeof(bool))
			{
				str = str.ToLower();
			}
			else if (type == typeof(Guid))
			{
				str = "\"" + str + "\"";
			}
			else if (type != typeof(string) && string.IsNullOrEmpty(str))
			{
				str = "\"" + str + "\"";
			}
			return str;
		}

		/// <summary>
		/// 过滤字符串
		/// </summary>
		public static string StringFilter(string str)
		{
			var sb = new StringBuilder();
			for (var i = 0; i < str.Length; i++)
			{
				var c = str.ToCharArray()[i];
				switch (c)
				{
					case '\"':
						sb.Append("\\\""); break;
					case '\\':
						sb.Append("\\\\"); break;
					case '/':
						sb.Append("\\/"); break;
					case '\b':
						sb.Append("\\b"); break;
					case '\f':
						sb.Append("\\f"); break;
					case '\n':
						sb.Append("\\n"); break;
					case '\r':
						sb.Append("\\r"); break;
					case '\t':
						sb.Append("\\t"); break;
					default:
						sb.Append(c); break;
				}
			}
			return sb.ToString();
		}
		#endregion

		#region 列转json
		/// <summary>
		/// 列转json
		/// </summary>
		/// <param name="dt">表</param>
		/// <param name="r">列</param>
		public static string ColumnToJson(DataTable dt, int r)
		{
			var strSql = new StringBuilder();
			for (var i = 0; i < dt.Rows.Count; i++)
			{
				strSql.Append(dt.Rows[i][r]);
				strSql.Append(",");
			}
			return strSql.ToString().Trim(',');
		}
		#endregion

		#region 对象转json
		/// <summary>
		/// 对象转json
		/// </summary>
		public static string ToJson(object jsonObject)
		{
			var sb = new StringBuilder();
			sb.Append("{");
			var propertyInfo = jsonObject.GetType().GetProperties();
			for (var i = 0; i < propertyInfo.Length; i++)
			{
				var objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);
				var type = propertyInfo[i].PropertyType;
				var strValue = objectValue.ToString();
				strValue = StringFormat(strValue, type);
				sb.Append("\"" + propertyInfo[i].Name + "\":");
				sb.Append(strValue + ",");
			}
			sb.Remove(sb.Length - 1, 1);
			sb.Append("}");
			return sb.ToString();
		}
		#endregion

		#region list转json
		/// <summary>
		/// list转json
		/// </summary>
		public static string ListToJson<T>(IList<T> list)
		{
			object obj = list[0];
			return ListToJson<T>(list, obj.GetType().Name);
		}

		private static string ListToJson<T>(IList<T> list, string JsonName)
		{
			var Json = new StringBuilder();
			if (string.IsNullOrEmpty(JsonName))
				JsonName = list[0].GetType().Name;
			Json.Append("{\"" + JsonName + "\":[");
			if (list.Count > 0)
			{
				for (var i = 0; i < list.Count; i++)
				{
					var obj = Activator.CreateInstance<T>();
					var pi = obj.GetType().GetProperties();
					Json.Append("{");
					for (var j = 0; j < pi.Length; j++)
					{
						var type = pi[j].GetValue(list[i], null).GetType();
						Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(pi[j].GetValue(list[i], null).ToString(), type));
						if (j < pi.Length - 1)
						{
							Json.Append(",");
						}
					}
					Json.Append("}");
					if (i < list.Count - 1)
					{
						Json.Append(",");
					}
				}
			}
			Json.Append("]}");
			return Json.ToString();
		}
		#endregion

		#region 对象集合转换为json
		/// <summary>
		/// 对象集合转换为json
		/// </summary>
		/// <param name="array">对象集合</param>
		/// <returns>json字符串</returns>
		public static string ToJson(IEnumerable array)
		{
			var jsonString = "[";
			foreach (var item in array)
			{
				jsonString += ToJson(item) + ",";
			}
			jsonString = jsonString.Substring(0, jsonString.Length - 1);
			return jsonString + "]";
		}
		#endregion

		#region 普通集合转换Json
		/// <summary>    
		/// 普通集合转换Json   
		/// </summary>   
		/// <param name="array">集合对象</param> 
		/// <returns>Json字符串</returns>  
		public static string ToArrayString(IEnumerable array)
		{
			var jsonString = "[";
			foreach (var item in array)
			{
				jsonString = ToJson(item.ToString()) + ",";
			}
			jsonString.Remove(jsonString.Length - 1, jsonString.Length);
			return jsonString + "]";
		}
		#endregion

		#region  DataSet转换为Json
		/// <summary>    
		/// DataSet转换为Json   
		/// </summary>    
		/// <param name="dataSet">DataSet对象</param>   
		/// <returns>Json字符串</returns>    
		public static string ToJson(DataSet dataSet)
		{
			var jsonString = "{";
			foreach (DataTable table in dataSet.Tables)
			{
				jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";
			}
			jsonString = jsonString.TrimEnd(',');
			return jsonString + "}";
		}
		#endregion

		#region Datatable转换为Json
		/// <summary>     
		/// Datatable转换为Json     
		/// </summary>    
		public static string ToJson(DataTable dt)
		{
			if (dt.Rows.Count > 0)
			{
				var jsonString = new StringBuilder();
				jsonString.Append("[");
				var drc = dt.Rows;
				for (var i = 0; i < drc.Count; i++)
				{
					jsonString.Append("{");
					for (var j = 0; j < dt.Columns.Count; j++)
					{
						var strKey = dt.Columns[j].ColumnName;
						var strValue = drc[i][j].ToString();

						var type = dt.Columns[j].DataType;
						jsonString.Append("\"" + strKey + "\":");
						strValue = StringFormat(strValue, type);
						if (j < dt.Columns.Count - 1)
							jsonString.Append(strValue + ",");
						else
							jsonString.Append(strValue);
					}
					jsonString.Append("},");
				}
				jsonString.Remove(jsonString.Length - 1, 1);
				jsonString.Append("]");
				return jsonString.ToString();
			}
			else
				return "[]";
		}

		/// <summary>    
		/// DataTable转换为Json
		/// </summary>    
		public static string ToJson(DataTable dt, string jsonName)
		{
			var Json = new StringBuilder();
			if (string.IsNullOrEmpty(jsonName))
				jsonName = dt.TableName;
			Json.Append("{\"" + jsonName + "\":[");
			if (dt.Rows.Count > 0)
			{
				for (var i = 0; i < dt.Rows.Count; i++)
				{
					Json.Append("{");
					for (var j = 0; j < dt.Columns.Count; j++)
					{
						var type = dt.Rows[i][j].GetType();
						Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j].ToString(), type));
						if (j < dt.Columns.Count - 1)
							Json.Append(",");
					}
					Json.Append("}");
					if (i < dt.Rows.Count - 1)
						Json.Append(",");
				}
			}
			Json.Append("]}");
			return Json.ToString();
		}
		#endregion

		#region DataReader转换为Json
		/// <summary>     
		/// DataReader转换为Json     
		/// </summary>     
		/// <param name="dataReader">DataReader对象</param>     
		/// <returns>Json字符串</returns>  
		public static string ToJson(DbDataReader dataReader)
		{
			var jsonString = new StringBuilder();
			jsonString.Append("[");
			while (dataReader.Read())
			{
				jsonString.Append("{");
				for (var i = 0; i < dataReader.FieldCount; i++)
				{
					var type = dataReader.GetFieldType(i);
					var strKey = dataReader.GetName(i);
					var strValue = dataReader[i].ToString();
					jsonString.Append("\"" + strKey + "\":");
					strValue = StringFormat(strValue, type);
					if (i < dataReader.FieldCount - 1)
						jsonString.Append(strValue + ",");
					else
						jsonString.Append(strValue);
				}
				jsonString.Append("},");
			}
			dataReader.Close();
			jsonString.Remove(jsonString.Length - 1, 1);
			jsonString.Append("]");
			return jsonString.ToString();
		}
		#endregion


		#region 返回错误
		public static string error()
		{
			var dt = new DataTable();
			dt.Columns.Add("error", typeof(int));
			var dr = dt.NewRow();
			dr["error"] = 1;
			dt.Rows.Add(dr);
			return ToJson(dt);
		}
		#endregion

	}
}
